package chapter05

/**
  * 高阶函数:能够接受函数作为参数的函数，叫做高阶函数 (higher-order function)==。可使应用程序更加健壮
  */
object Test06_HighOrderFunction {

  def main(args: Array[String]): Unit = {
    def f(n: Int): Int = {
      n + 1
    }

    val result = f(23)
    println(result)

    //1.函数作为值进行传递
    // 声明f1 f2是函数
    val f1: Int => Int = f
    val f2 = f _

    println(f1)
    println(f1(55))
    println(f2)
    println(f2(66))

    //2.函数作为参数进行传递
    // 定义二元计算函数
    def dualEval(op: (Int, Int) => Int, a: Int, b: Int): Int = {
      op(a, b)
    }

    val sum1 = dualEval((a: Int, b: Int) => {
      a + b
    }, 1, 2)
    val sum2 = dualEval((a, b) => a + b, 1, 2)
    val sum3 = dualEval(_ + _, 1, 2)
    println(sum1)
    println(sum2)
    println(sum3)

    //3.函数作为函数的返回值返回
    def f5(): Int => Unit = {
      def f6(a: Int): Unit = {
        println(s"f6调用了:$a")
      }
      f6 // 将函数直接返回
      // f6 _
    }
    // 调用f6
    println(f5()(888))


  }
}
